package com.iee.md5;


import org.springframework.util.DigestUtils;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;


//md5加密工具
public class MD5Util {


    public static String md5(String password) {


        try {
            MessageDigest md = MessageDigest.getInstance("md5");
            byte[] array = md.digest(password.getBytes()); //加密后的md5数据
            StringBuffer sb = new StringBuffer();
            for (byte b : array) {
                //转换好后的字符串
                String str = null;

                //把每个10进制的数字转换成16进制的字符串
                str = Integer.toHexString(b);

                //如果是赋值则保留后两位字符串
                if (b < 0) {
                    str = str.substring(str.length() - 2);
                }

                //如果转换后只有1位，则在前面补0
                if (str.length() == 1) {
                    str = "0" + str;
                }


                sb.append(str);
            }
            return sb.toString();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
            System.out.println("加密失败");
            throw new RuntimeException(e);
        }
    }

    /**
     * MD5加密方法
     * @param str 明文
     * @return 密文(32位)
     */
    public static String md5_2(String str) throws Exception{
        /** 创建加密对象 */
        MessageDigest md = MessageDigest.getInstance("MD5");
        /** 加密 */
        md.update(str.getBytes("utf-8"));
        /** 获取加密后的内容 (16位的字符数组) */
        byte[] md5Bytes = md.digest();
        System.out.println("加密前：" + Arrays.toString(str.getBytes()));
        System.out.println("加密后：" + Arrays.toString(md5Bytes));
        String res = "";
        /** 把加密后字节数组转化成32位字符串 (把每一位转化成16进制的两位) */
        for (int i = 0; i < md5Bytes.length; i++){
            byte a = md5Bytes[i];
            int temp = a & 0xFF;
            /** 把temp值转化成16进制的两位数，如果不够两位前面补零 */
            if (temp <= 0xF){
                res += "0";
            }
            res += Integer.toHexString(temp);
        }
        return res;
    }

    public static String md5_3(String str) {
//        String base = str +"/"+slat;
        String md5 = DigestUtils.md5DigestAsHex(str.getBytes());
        return md5;
    }

    public static void main(String[] args) throws Exception {
        System.out.println(MD5Util.md5_3("admin"));

        //-127 -36 -101 -37 82 -48 77 -62 0 54 -37 -40 49 62 -48 85   10进制

        //81dc9bdb52d04dc20036dbd8313ed055   16进制
        //81dc9bdb52d04dc20036dbd8313ed055

        //21232f297a57a5a743894a0e4a801fc3
        //21232f297a57a5a743894a0e4a801fc3
    }
}
